package application.messager;

import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * 消息携带者，此类对象携带者要传递的消息。
 */
public class Messager {

    /**
     * 传递动作，它就像是一个标志，它通过此标记，判别消息接收者是否要接受此消息
     */
    @Getter
    private String action;

    /**
     * 保存者，此对象用来保存消息，它的key是一个String字符串
     */
    private Map<String, Object> saver;

    /**
     * Messager的有参构造方法
     *
     * @param action 用来判断消息接收者是否是符合要求的消息接收者
     */
    public Messager(String action) {
        this.action = action;
        saver = new HashMap<>();
    }

    /**
     * 调用此方法，将要传递的消息，放入对象中保存
     *
     * @param key   用于快速找到需要的信息
     * @param value 被传递的信息
     */
    public void put(String key, Object value) {
        this.saver.put(key, value);
    }

    /**
     * 调用此方法获取要接收的消息
     *
     * @param key          消息的传递时的key值
     * @param defaultValue 当找不到key的对应值时，使用defaultValue
     * @param <T>          泛型，可以是任何类型
     * @return 消息信息，或者defaultValue
     */
    public <T> T get(String key, T defaultValue) {
        T target = (T) this.saver.get(key);
        if (target == null) {
            return defaultValue;
        }
        return target;
    }

    /**
     * 调用此方法想消息接收者发送消息。
     */
    public void sendMessage() {
        MessageCenter.getInstance().notifyMessageReceiver(this);
    }
}
